package jus.poc.prodcons.v3;

import jus.poc.prodcons.*;

/**
 * @author Nunes Thomas <nds.thomas@gmail.com>
 * @author Feng Xu <fengxu1989@gmail.com>
 */
public class Producteur extends Acteur implements _Producteur {

    protected int nbMessages;
    protected int MesTransmit;
    protected ProdCons buffer;
    protected int id;

    /**
     * Constructeur d'un producteur
     *
     * @param type
     * @param observateur
     * @param moyenneTempsDeTraitement
     * @param deviationTempsDeTraitement
     * @throws ControlException
     */
    protected Producteur(int type, Observateur observateur,
            int moyenneTempsDeTraitement, int deviationTempsDeTraitement)
            throws ControlException {
        super(type, observateur, moyenneTempsDeTraitement,
                deviationTempsDeTraitement);
    }

    /**
     * Constructeur d'un producteur avec identifiant
     *
     * @param observateur
     * @param moyenneTempsDeTraitement
     * @param deviationTempsDeTraitement
     * @param tampon
     * @param moyex Le nombre moyen que le producteur va produire
     * @param derivex la derivation du nombre moyen
     * @param id Le numero du producteur
     * @throws ControlException
     */
    public Producteur(Observateur observateur, int moyenneTempsDeTraitement,
            int deviationTempsDeTraitement, ProdCons tampon, int moyex, int derivex, int id)
            throws ControlException {
        this(typeProducteur, observateur, moyenneTempsDeTraitement,
                deviationTempsDeTraitement);
        Aleatoire alea = new Aleatoire(moyex, derivex);
        this.buffer = tampon;
        nbMessages = alea.next();
        MesTransmit = 0;
        this.id = id;
    }

    @Override
    public int nombreDeMessages() {
        return nbMessages;
    }

    @Override
    public void run() {
        while (MesTransmit < nbMessages) {
            try {
                Aleatoire alea = new Aleatoire(this.moyenneTempsDeTraitement(),
                        this.deviationTempsDeTraitement());
                int delai = alea.next();
                MessageX message = new MessageX(this.toString());
                observateur.productionMessage(this, message, delai);
                sleep(delai);
                buffer.put(this, message);
                MesTransmit++;
            } catch (InterruptedException e) {
            } catch (Exception e) {
            }
        }
    }

    @Override
    public String toString() {
        return "Prod" + id;
    }

    /**
     * Permet de notifier a l'observateur que l'on a depose un message dans le
     * tampon
     *
     * @param message Le message qui est stocke dans le tampon dorenavant
     * @throws InterruptedException
     * @throws ControlException
     */
    public void deposerMessage(Message message) throws InterruptedException, ControlException {
        observateur.depotMessage(this, message);
    }
}
